package xkp.lesson1;

import java.util.Iterator;
import java.util.LinkedList;

public class TestLinkedList {
	public static void main(String[] args) {
		LinkedList<String> linkedList = new LinkedList<String>();
		linkedList.add("1111");
		linkedList.add("222");
		linkedList.add("333");
		linkedList.add("4444");
		linkedList.add("4444");
		linkedList.add("4444");
		linkedList.add("555");
		linkedList.add("666");
		linkedList.add("777");
		System.out.println(linkedList);
		linkedList.remove("222");
		System.out.println(linkedList);
		System.out.println(linkedList.get(2));
		linkedList.set(2, "abc");
		System.out.println(linkedList);
		System.out.println(linkedList.get(2));
		//LinkeList的平均查找效率为n/4
		for(String str:linkedList) {
			System.out.println(str);
		}
//		
//		for(int i = 0; i < linkedList.size(); i++) {
//			if(linkedList.get(i).equals("4444")) {
//				linkedList.remove(i);
//				i--;
//			}
//			//System.out.println(linkedList.get(i));
//		}
		System.out.println("**********************");
		Iterator<String> iterator = linkedList.iterator();
		while(iterator.hasNext()) {
			if(iterator.next().equals("4444")) {
				iterator.remove();
			}
		}
		
		for(String str:linkedList) {
			System.out.println(str);
		}
		
		//到目前为止我们知道LinkedList与ArrayList的用法基本一致
		//底层ArrayList是基于数组，LinkedList是基于双向连表
		//1、以add为例，两者都是在尾部添加,ArrayList的add在空间不够时需要扩容,但是LinkedList从来都不需要要扩容
		//1.1 扩容会产生垃圾内存(旧数组) 
		//1.2ArrayList的add效率远低于LinkedList
		//1.3 在指定位置添加ArrayList效率更低  LinkedList的add的效率远远高于ArrayList
		
		//2、以删除为例 
		//ArrayList的删除会引起数据的重新排列  LinkedList的remove效率远远高于ArrayList
		
		//3、修改 set(int index,int data)
		//3.1 如果要修改指定位置的数据，则先要根据索引获取指定位置元素,所以此处本质上是在比较查找的效率
		
		//4、查找 get(int index)
		//ArrayList的查找本质上是通过数组下标返回数据，基本上是已知的最快的查询效率
		//LinkedList是从头部或者尾部逐个遍历 查找效率为n/4,但是数据基本一直为0
		
		
	}

}
